﻿//+-------------------------------------------------------------------------------------------------------------------------------------------------------
//
//Description:   Parameters And Payload Cleanup Helper
//Author: Aravind Ramarathinam (aravr@microsoft.com)
//Copyright © Microsoft Corporation
//Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. 
//You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 
//
//THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, 
//INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. 
//See the Apache Version 2.0 License for specific language governing permissions and limitations under the License.
// 
//--------------------------------------------------------------------------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;


namespace VmroleAuthor.ViewModels
{
    public class ParametersAndPayloadCleanupHelper
    {
        public static List<string> GetPropertyNames(Type propertiesClass)
        {
            FieldInfo[] fieldsToValidate = propertiesClass.GetFields();
            return fieldsToValidate.Select(fieldInfo => fieldInfo.Name).ToList();
        }
       
        public static void CleanupParametersAndPayloads(object childPropertyValue)
        {
            if ((childPropertyValue as TreeViewItemViewModel) != null)
            {
                return;
            }

            ICleanupParamsAndPayload propertyToBeCleanedUp = childPropertyValue as ICleanupParamsAndPayload;
            if (propertyToBeCleanedUp != null)
            {
                propertyToBeCleanedUp.Cleanup();                
            }
            else
            {
                IEnumerable<ICleanupParamsAndPayload> childNonTreeViewModels = childPropertyValue as IEnumerable<ICleanupParamsAndPayload>;
                if (childNonTreeViewModels != null)
                {
                    foreach (ICleanupParamsAndPayload childNonTreeViewModel in childNonTreeViewModels)
                    {
                        childNonTreeViewModel.Cleanup();                     
                    }
                }
            }
        }


        public static void CleanupParametersAndPayload(TreeViewItemViewModel parent, Type propertiesClass)
        {
            ICleanupParamsAndPayload parentCleanupParamsAndPayload = parent as ICleanupParamsAndPayload;
            if (parentCleanupParamsAndPayload == null)
            {
                return;
            }       
            List<string> propNames = GetPropertyNames(propertiesClass);
            foreach (string propName in propNames)
            {              
                // Clean up child properties
                object propValue = parent.GetType().GetProperty(propName).GetValue(parent);
                CleanupParametersAndPayloads(propValue);
            }

            foreach (TreeViewItemViewModel child in parent.Children)
            {
                ICleanupParamsAndPayload childCleanupParamsAndPayload = child as ICleanupParamsAndPayload;
                if (childCleanupParamsAndPayload != null)
                {
                    childCleanupParamsAndPayload.Cleanup();                   
                }
            }
        }

    } 
}
